#!/usr/bin/env node

/**
 * 安全修复脚本
 * 自动修复项目中的安全问题
 */

import fs from 'fs';
import path from 'path';
import { execSync } from 'child_process';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

console.log('🔒 开始安全修复...\n');

// 1. 更新有漏洞的依赖包
console.log('📦 更新安全依赖包...');
try {
  execSync('npm audit fix', { stdio: 'inherit' });
  console.log('✅ 依赖包更新完成\n');
} catch (error) {
  console.log('⚠️  自动修复失败，尝试强制修复...');
  try {
    execSync('npm audit fix --force', { stdio: 'inherit' });
    console.log('✅ 强制修复完成\n');
  } catch (forceError) {
    console.log('❌ 自动修复失败，请手动检查\n');
  }
}

// 2. 检查并替换 vm2 使用
console.log('🔍 检查 vm2 使用情况...');
const srcDir = path.join(__dirname, '../src');

function findVm2Usage(dir) {
  const files = fs.readdirSync(dir);
  const vm2Files = [];

  for (const file of files) {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);

    if (stat.isDirectory()) {
      vm2Files.push(...findVm2Usage(filePath));
    } else if (file.endsWith('.ts') || file.endsWith('.js') || file.endsWith('.vue')) {
      const content = fs.readFileSync(filePath, 'utf8');
      if (content.includes('vm2') || content.includes('NodeVM') || content.includes('VM')) {
        vm2Files.push(filePath);
      }
    }
  }

  return vm2Files;
}

const vm2Files = findVm2Usage(srcDir);
if (vm2Files.length > 0) {
  console.log('⚠️  发现使用 vm2 的文件:');
  vm2Files.forEach(file => {
    console.log(`   - ${path.relative(process.cwd(), file)}`);
  });
  console.log('💡 请使用新的安全沙箱: src/core/security/sandbox.ts\n');
} else {
  console.log('✅ 未发现 vm2 使用\n');
}

// 3. 检查危险的 console.log
console.log('🔍 检查调试代码...');
function findConsoleLog(dir) {
  const files = fs.readdirSync(dir);
  const consoleFiles = [];

  for (const file of files) {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);

    if (stat.isDirectory()) {
      consoleFiles.push(...findConsoleLog(filePath));
    } else if (file.endsWith('.ts') || file.endsWith('.js') || file.endsWith('.vue')) {
      const content = fs.readFileSync(filePath, 'utf8');
      const lines = content.split('\n');
      
      lines.forEach((line, index) => {
        if (line.includes('console.log') || line.includes('console.warn') || line.includes('console.error')) {
          consoleFiles.push({
            file: filePath,
            line: index + 1,
            content: line.trim(),
          });
        }
      });
    }
  }

  return consoleFiles;
}

const consoleUsage = findConsoleLog(srcDir);
if (consoleUsage.length > 0) {
  console.log(`⚠️  发现 ${consoleUsage.length} 处调试代码:`);
  consoleUsage.slice(0, 10).forEach(item => {
    console.log(`   - ${path.relative(process.cwd(), item.file)}:${item.line}`);
  });
  if (consoleUsage.length > 10) {
    console.log(`   ... 还有 ${consoleUsage.length - 10} 处`);
  }
  console.log('💡 请使用新的日志系统: src/utils/logger.ts\n');
} else {
  console.log('✅ 未发现调试代码\n');
}

// 4. 检查 any 类型使用
console.log('🔍 检查 any 类型使用...');
function findAnyUsage(dir) {
  const files = fs.readdirSync(dir);
  const anyFiles = [];

  for (const file of files) {
    const filePath = path.join(dir, file);
    const stat = fs.statSync(filePath);

    if (stat.isDirectory()) {
      anyFiles.push(...findAnyUsage(filePath));
    } else if (file.endsWith('.ts') || file.endsWith('.vue')) {
      const content = fs.readFileSync(filePath, 'utf8');
      const lines = content.split('\n');
      
      lines.forEach((line, index) => {
        // 匹配 any 类型使用（排除注释）
        if (/:\s*any\b/.test(line) && !line.trim().startsWith('//') && !line.trim().startsWith('*')) {
          anyFiles.push({
            file: filePath,
            line: index + 1,
            content: line.trim(),
          });
        }
      });
    }
  }

  return anyFiles;
}

const anyUsage = findAnyUsage(srcDir);
if (anyUsage.length > 0) {
  console.log(`⚠️  发现 ${anyUsage.length} 处 any 类型使用:`);
  anyUsage.slice(0, 10).forEach(item => {
    console.log(`   - ${path.relative(process.cwd(), item.file)}:${item.line}`);
  });
  if (anyUsage.length > 10) {
    console.log(`   ... 还有 ${anyUsage.length - 10} 处`);
  }
  console.log('💡 请使用具体类型定义: src/types/global.d.ts\n');
} else {
  console.log('✅ 未发现 any 类型使用\n');
}

// 5. 生成安全报告
const report = {
  timestamp: new Date().toISOString(),
  vulnerabilities: {
    vm2Usage: vm2Files.length,
    consoleUsage: consoleUsage.length,
    anyUsage: anyUsage.length,
  },
  recommendations: [
    vm2Files.length > 0 ? '替换 vm2 为安全沙箱' : null,
    consoleUsage.length > 0 ? '替换 console 为日志系统' : null,
    anyUsage.length > 0 ? '替换 any 为具体类型' : null,
  ].filter(Boolean),
};

fs.writeFileSync(
  path.join(__dirname, '../security-report.json'),
  JSON.stringify(report, null, 2),
);

console.log('📊 安全报告已生成: security-report.json');
console.log('🎉 安全检查完成！');

if (report.recommendations.length === 0) {
  console.log('✅ 项目安全状况良好');
} else {
  console.log('⚠️  请根据建议进行优化');
}